package CalculDesSalaires.impl;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import CalculDesSalaires.ICompany;

/**
 * Réprésente la class Company. 
 * permet la création d'une socité. 
 * ainsi que des attributs et méthodes qui lui sont propres.
 * @author Hetoo
 *
 */
public class Company implements ICompany {

	protected static String TheName;
	protected HashSet<Employee> listEmployee ; 
	private boolean ecrireEnTete = true;
	protected HashSet<Mentee> listMentees;

	/**
	 * Constructeur paramétré.
	 * @param theName
	 * @param listEmployee
	 * @param listMentees
	 */
	public Company(String theName, HashSet<Employee> listEmployee, HashSet<Mentee> listMentees) {
		super();
		TheName = theName;
		this.listEmployee = listEmployee;
		this.listMentees = listMentees;
	}

	/**
	 * constructeur par défaut.
	 */
	public Company(){
		this("",null,null);
	}
	
	/**
	 * La classe Company a deux méthodes addEmployee. 
	 * Une pour ajouter un employé à la liste des employés.
	 */
	public void addEmployee(Employee employee) {
		
		this.listEmployee.add(employee);
	}
	
	/**
	 * La classe Company a deux méthodes addEmployee. 
	 * Une autre pour ajouter un mentoré à la liste des employés et associer ce mentoré à un mentor. 
	 */
	public void addEmployee(Mentee mentee, Mentor mentor){

		if(mentee.setLanguage().equals(mentor.setLanguage())==false){ 
			System.out.println("le mentee ne peut pas être associé au mentor (language différent) \n");
		}
		else{
			this.listMentees.add(mentee);
			mentee.setMentor(mentor);
			mentor.addMentee(mentee);
		}
	}
	
	/**
	 * Méthode permettant l'affichage de l'ensemble des employés de la company.
	 */
	public void displayEmployees(){
		
		System.out.println("Calcul des salaires mensuels des employés de " + TheName +"\n");

		for(Employee employ : this.listEmployee){
			displayEmployees(employ);
		}
			
	}
	
	/**
	 * Méthode parcourant la collection des employés.
	 * Appeleront des méthodes d'affichage des informations d'un employée.
	 */
	public void displayEmployees(Employee employ){
	
			Mentor mentor = new Mentor();
			Mentee mentees = new Mentee();
			
			if (employ.getClass() == mentor.getClass()){
				System.out.println("Nom : " +employ.getTheName() + "\t // Mentor");
			}
			else if (employ.getClass() == mentees.getClass()){
				System.out.println("Nom : " +employ.getTheName() + "\t // Mentoré");
			}
			else 
				System.out.println("Nom : " +employ.getTheName() + "\t // Employé qui n'a pas de mentoré");
			
			System.out.println("numéro de Paie : " + employ.getNumeroDePaiement());
			if (employ.setLanguage()!="")
					System.out.println("Langage : " + employ.setLanguage());
			
			System.out.println("Salaire de Base : " + employ.getSalaire());
			
			if (employ.getClass() == mentor.getClass()){
				mentor = (Mentor) employ;
				
				if(mentor.getListMentees()!=null){
					boolean ecrireEnTete = true ;
					for(Mentee mentee : mentor.getListMentees()){
						if(ecrireEnTete)		
						System.out.println("Son (ses) mentoré(s) est(son) : "); 
						ecrireEnTete = false;
						System.out.println( mentee.getTheName() + " avec le numéro de paie " + mentee.getNumeroDePaiement() );
					}
				
				}
			}
			
			else{
					if(employ.getClass() == mentees.getClass()){
					mentees = (Mentee) employ;
					System.out.println("Son mentor est "+mentees.getNameMentor()+" avec le numéro de paie " + mentees.getNumeroDePaie());
				}

			}
				
			System.out.println("Salaire du mois : " + employ.getSalaireDuMois() + "\n");
		//}
		
	}
	
	/**
	 * Méthode parcourant la collection des employés.
	 * Appeleront des méthodes d'écriture des informations d'un employée.
	 * Dans un fichier texte. 
	 * @param theFile
	 */
	public void displayReport(String theFile){
		try
		{
			BufferedWriter pw = new BufferedWriter (getWriter(theFile));
  						
			// test pour permettre l'écriture d'entête seulement lors de la première ecriture du fichier. 
			if(ecrireEnTete) {
				pw.append("Calcul des salaires mensuels des employés de " + TheName +"\n");
				pw.newLine();
			}
			ecrireEnTete = false ; 

			Mentor mentor = new Mentor();
			Mentee mentees = new Mentee();

			for (Employee employ : this.listEmployee)
			{
				StringBuilder builder = new StringBuilder();
				
				if (employ.getClass() == mentor.getClass()){
					builder.append("Nom : " +employ.getTheName() + "\t // Mentor \n");
				}
				else if (employ.getClass() == mentees.getClass()){
					builder.append("Nom : " +employ.getTheName() + "\t // Mentoré \n");
				}
				else 
					builder.append("Nom : " +employ.getTheName() + "\t // Employé qui n'a pas de mentoré");
		
				builder.append("numéro de Paie : ")
					   	.append(employ.getNumeroDePaiement())
					   	.append('\n')
					   	.append("Langage : ")
					   	.append(employ.setLanguage())
						.append('\n')
						.append("Salaire de Base : ")
						.append(employ.getSalaire())
						.append('\n');
				
				if (employ.getClass() == mentor.getClass()){
					mentor = (Mentor) employ;
					
					if(mentor.getListMentees()!=null){
						
						boolean ecrireEnTete = true ;
						for(Mentee mentee : mentor.getListMentees()){
							if(ecrireEnTete)		
								builder.append("Son (ses) mentoré(s) est(son) : \n"); 
								ecrireEnTete = false;
								builder.append( mentee.getTheName() + " avec le numéro de paie " + mentee.getNumeroDePaiement() +"\n");
							
						}
					
					}
				}
				
				else{
					
					Mentee mentee = new Mentee();
					if(employ.getClass() == mentee.getClass()){
						mentee = (Mentee) employ;
						builder.append("Son mentor est "+mentee.getNameMentor()+" avec le numéro de paie " + mentee.getNumeroDePaie() + "\n");
					}

				}
				
				builder.append("Salaire du mois : ")
						.append(employ.getSalaireDuMois())
						.append('\n');

				pw.append(builder.toString());
				pw.newLine();
			}
  
			pw.close();
		}
		
		catch (IOException exception)
		{
			System.out.println ("Erreur lors de la lecture : " + exception.getMessage());
		}
		
	}

	protected java.io.Writer getWriter(String theFile) throws IOException {
		File f = new File(theFile);
		return new FileWriter (f,true);
	}
	
	/**
	 * Méthode permettant de récupérer la liste de Mentee de la company.
	 * @return
	 */
	public HashSet<Mentee> getListMentee(){
		return listMentees;
	}
	
}